<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

    <script>

        // 作用域：变量生效的范围
        //    全局作用域  --- 全局变量   --- 在整个页面中都可以使用 , 不能跨页面
        //    局部作用域  --- 局部变量   ---  函数为界
        //        函数内部声明的叫做局部变量  --- 局部变量只能在函数中使用
        //        函数外面声明的叫做全局变量  --- 函数内外都可以使用

        //    函数可以使用和改变全局变量
        //    变量没有声明直接赋值，会提升为全局变量


        // 注意：作用域是一个相对的概念
        //    函数也存在嵌套关系(父子关系  子可以访问父，父不能访问子)
        //    函数内部可以访问函数外部的变量，但是外部不能访问内部的变量  


        //  函数在访问变量的时候，优先使用自己的，自己没有就向外一层查找
        //      自己有的时候，用自己的，外面不变
        //      自己没有的时候，就使用外面的，也会改变外面的


        // 在js中允许重复声明同一个变量  从上而下
        // 在js中，变量可以不声明直接赋值 






        // var x = 2 ;

        // var x = 3 ;
        // console.log(x);  // 3

        // x = 2 ;
        // console.log(x);

        // var y = 5 ;

        // function fn() {
        //     var a = 2 ;   // 是在函数内部声明的变量 --- 局部变量
        //     console.log(y);  // 是在函数外部声明的变量  --- 全局变量   在函数中也可以直接使用


        //     b = 6 ;   // 变量在赋值的时候，如果没有var  会提升为全局变量
        //     y++ ;
        // }

        // fn() ;


        // // console.log(a);   // 报错  a是局部变量
        // console.log(b) ;

        // console.log(y);  // 6









        
        // 全局变量的使用和改变
        // var s = 1 ;

        // function ff() {
        //     s++ ;
        // }

        // console.log(s);   // 1

        // ff() ;
        // console.log(s);   // 2


        // ff() ;
        // console.log(s);  // 3



        // 局部变量是一个相等的概念

        // function ff() {
        //     var a = 1 ;  // 局部变量
        // }

        // function f2() {
        //     console.log(a);   // 报错   一个函数不能使用另一个函数的局部变量
        // }

        // f2() ;


        // 作用域是相对的概念  子可以访问父，父不能访问子
        // function ff() {
        //     var a = 1 ;

        //     // 在ff函数里面，声明了另一个函数f2   --- f2是一个局部函数  只能在ff这个函数中调用，外面不能调用
        //     function f2() {
        //         console.log(a);    // 1
        //     }

        //     f2() ;
        // }


        // // f2() ;   // f2报错  

        // ff() ;





        var m = 2 ;
        function f() {
            // 函数中，优先使用自己的变量，自己没有就向外一层查找
            var m = 5 ;
            m++ ;  // 改变的也是自己的
            console.log(m);
        }
        f() ;
        console.log(m);  // 2   m在函数的外部，不能访问到内部的




    </script>

    <script>

        // console.log(x);

    </script>
    
</body>
</html>